package design_pattern.singleton;


/**
 * @Name : singleton.SingleTon03
 * @Description : 懒加载，线程安全，双重检查
 * Created by cyd on 2021-02-02 13:38:41
 */
public class SingleTon06 {
    public static void main(String[] args) {
        // 测试，拿到的实例是同一个对象
        Singlton07 instance = Singlton07.getInstance();
        Singlton07 instance1 = Singlton07.getInstance();
        System.out.println(instance == instance1);
    }
}

class Singlton06 {
    // 1.私有化构造器
    private Singlton06() {
    }

    // 2.本例内部声明对象实例,用volatile关键字
    private static volatile Singlton06 instance;

    // 3.提供一个共有的静态方法，返回这个实例对象
    public static Singlton06 getInstance() {
        // 4.在返回前判断：如果没有被实例化，就在此处实例化
        if (instance == null) {
            // 5.将实例化过程加上同步锁
            synchronized (Singlton06.class) {
                // 6.双重检查，此处的if能避免创建多个对象
                if (instance == null) {
                    instance = new Singlton06();
                }
            }
        }
        return instance;
    }
}
